package com.ungs.form;

import java.awt.BorderLayout;
import java.awt.FlowLayout;

import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JLabel;
import javax.swing.JTextField;

import com.ungs.entities.DetalleStock;
import com.ungs.entities.Material;
import com.ungs.entities.OrdenTrabajo;
import com.ungs.entities.StockMaterial;
import com.ungs.form.impl.OrdenTrabajoFormImpl;
import com.ungs.form.impl.StockFormImpl;
import com.ungs.utils.Fechas;
import com.ungs.utils.ValidacionCampo;

import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.List;

import javax.swing.JComboBox;
import java.awt.Color;

public class DescontarStockForm extends JDialog {

	private static final long serialVersionUID = 1L;
	private final JPanel contentPanel = new JPanel();
	private JTextField txtDescontar;
	private int cantidadDescontar;
	private StockMaterial stockMaterial;
	private StockFormImpl stockFormImpl;
	private OrdenTrabajoFormImpl ordenTrabajoFormImpl;
	private JTextField txtOrdenTrabajo;
	private JComboBox jcbElemento;
	private List<Material> materialList;
	private OrdenTrabajo ordenTrabajo;

	public DescontarStockForm(JDialog parent, StockMaterial stockMaterial) {
		super(parent, true);
		setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
		setResizable(false);
		setLocationRelativeTo(parent);
		initForm();
		cantidadDescontar = 0;
		this.stockMaterial = stockMaterial;
		stockFormImpl = new StockFormImpl();
		ordenTrabajoFormImpl = new OrdenTrabajoFormImpl();
	}

	private void initForm() {
		setTitle("Descontar Stock");
		setBounds(100, 100, 353, 270);
		getContentPane().setLayout(new BorderLayout());
		contentPanel.setBorder(new EmptyBorder(5, 5, 5, 5));
		getContentPane().add(contentPanel, BorderLayout.CENTER);
		contentPanel.setLayout(null);
		{
			JLabel lbDescontar = new JLabel(
					"Ingrese la cantidad para descontar");
			lbDescontar.setBounds(10, 140, 185, 14);
			contentPanel.add(lbDescontar);
		}
		{
			txtDescontar = new JTextField();
			txtDescontar.addKeyListener(new KeyAdapter() {
				@Override
				public void keyTyped(KeyEvent e) {
					ValidacionCampo.verificarSoloNumeros(e);
					ValidacionCampo.verificarLargoCamposJTextField(e,
							txtDescontar, 6);
				}
			});
			txtDescontar.setBounds(10, 170, 61, 20);
			contentPanel.add(txtDescontar);
		}

		txtOrdenTrabajo = new JTextField();
		txtOrdenTrabajo.setBackground(Color.LIGHT_GRAY);
		txtOrdenTrabajo.setEditable(false);
		txtOrdenTrabajo.setBounds(10, 28, 113, 20);
		contentPanel.add(txtOrdenTrabajo);
		txtOrdenTrabajo.setColumns(10);

		JLabel lbOrdenTrabajo = new JLabel("Orden de Trabajo");
		lbOrdenTrabajo.setBounds(10, 11, 101, 14);
		contentPanel.add(lbOrdenTrabajo);

		JButton btnBuscarOT = new JButton("Buscar");
		btnBuscarOT.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent e) {
				eventoBotonBuscarOT();
			}
		});
		btnBuscarOT.setBounds(133, 27, 91, 23);
		contentPanel.add(btnBuscarOT);

		jcbElemento = new JComboBox();
		jcbElemento.setEnabled(false);
		jcbElemento.setBounds(10, 92, 113, 22);
		contentPanel.add(jcbElemento);

		JLabel lbElemento = new JLabel("Elemento");
		lbElemento.setBounds(10, 67, 46, 14);
		contentPanel.add(lbElemento);
		{
			JPanel buttonPane = new JPanel();
			buttonPane.setLayout(new FlowLayout(FlowLayout.RIGHT));
			getContentPane().add(buttonPane, BorderLayout.SOUTH);
			{
				JButton okButton = new JButton("Aceptar");
				okButton.addMouseListener(new MouseAdapter() {
					@Override
					public void mouseClicked(MouseEvent e) {
						eventoBotonAceptar();
					}
				});
				buttonPane.add(okButton);
				getRootPane().setDefaultButton(okButton);
			}
			{
				JButton cancelButton = new JButton("Cancelar");
				cancelButton.addMouseListener(new MouseAdapter() {
					@Override
					public void mouseClicked(MouseEvent e) {
						eventoBotonCancelar();
					}
				});
				buttonPane.add(cancelButton);
			}
		}
	}

	private void eventoBotonAceptar() {
		if (!txtDescontar.getText().trim().isEmpty()) {
			cantidadDescontar = Integer.parseInt(txtDescontar.getText());
			boolean validarDescuento = true;

			if (stockMaterial.getOrdenTrabajo() != null) {
				// Tiene asociada OT
				validarDescuento = verificarDescuento();
			} else {
				if (!txtOrdenTrabajo.getText().isEmpty()
						&& jcbElemento.getSelectedIndex() >= 0
						&& !txtDescontar.getText().trim().isEmpty()) {
					Material material = materialList.get(jcbElemento
							.getSelectedIndex());
					if (material.getCalidad().getDescripcion()
							.equals(stockMaterial.getCalidad().getDescripcion())
						&& material.getVariante().getDescripcion()
							.equals(stockMaterial.getVariante().getDescripcion())
						&& material.getFormatoPapel().getFormatoPapel()
							.equals(stockMaterial.getFormatoPapel().getFormatoPapel())
						&& material.getGramaje() == stockMaterial.getGramaje()) {

					} else {
						JOptionPane.showMessageDialog(this,
								"No coinciden los materiales.", "Advertencia",
								JOptionPane.WARNING_MESSAGE);
						return;
					}
				}
			}
			if (validarDescuento) {
				// Si esta todo ok con la OT y elemento se descuenta
				if (!txtOrdenTrabajo.getText().isEmpty()
						&& jcbElemento.getSelectedIndex() >= 0
						&& !txtDescontar.getText().trim().isEmpty()) {
					int cantidadActual = stockMaterial.getCantidad();
					String elemento = (String) jcbElemento.getSelectedItem();
					if (stockMaterial.getCantidad() >= cantidadDescontar) {
						// Si hay stock se descuenta
						stockMaterial.setCantidad(cantidadActual
								- cantidadDescontar);
						stockFormImpl.actualizarStock(stockMaterial);

						// Se crea el detalle de stock
						DetalleStock detalleStock = new DetalleStock();
						detalleStock.setFechaSalida(Fechas
								.getFechaActualConHoraDate());
						detalleStock.setStockMaterial(stockMaterial);
						detalleStock.setCantidadRetirada(cantidadDescontar);
						detalleStock.setElemento(elemento);
						detalleStock.setOrdenTrabajo(ordenTrabajo);
						stockFormImpl.guardarDetalleStock(detalleStock);

						if (stockMaterial.getCantidad() == 0) {
							// Si el stock llega a 0 se da de baja con la fecha
							stockMaterial.setFechaBaja(Fechas
									.getFechaActualConHoraDate());
							stockFormImpl
									.eliminarStockMaterialLogica(stockMaterial);
						}
						this.setVisible(false);
						this.dispose();
					} else {
						// Si no hay stock muestra mensaje y
						// deja valor para descontar
						txtDescontar.setText(String.valueOf(cantidadActual));
						JOptionPane.showMessageDialog(this,
								"No se puede descontar mas de\nlo que hay en stock.\nValor actual = "
										+ cantidadActual, "Advertencia",
								JOptionPane.WARNING_MESSAGE);
					}
				} else {
					JOptionPane.showMessageDialog(this,
							"Complete todos los datos.", "Advertencia",
							JOptionPane.WARNING_MESSAGE);
				}
			} else {
				JOptionPane.showMessageDialog(this,
						"El material descontado\nno pertenece a esta OT.\n"
								+ "No se descuenta.", "Advertencia",
						JOptionPane.WARNING_MESSAGE);
			}
		}

	}

	private void eventoBotonCancelar() {
		this.setVisible(false);
		this.dispose();
	}

	private void eventoBotonBuscarOT() {
		List<OrdenTrabajo> ordenTrabajoList = ordenTrabajoFormImpl
				.getOrdenTrabajoEnCurso();
		ConsultaOrdenTrabajoForm consultaOrdenTrabajoForm = new ConsultaOrdenTrabajoForm(
				this, ordenTrabajoList, false);
		consultaOrdenTrabajoForm.setVisible(true);
		ordenTrabajo = consultaOrdenTrabajoForm.getOrdenTrabajo();
		consultaOrdenTrabajoForm.dispose();

		jcbElemento.removeAllItems();

		if (ordenTrabajo != null) {
			materialList = ordenTrabajoFormImpl
					.getMaterialesPorOrdenTrabajo(ordenTrabajo);
			txtOrdenTrabajo.setText(ordenTrabajo.getNumIdentificatorio());
			for (Material material : materialList) {
				jcbElemento.addItem(material.getElemento());
			}
			jcbElemento.setEnabled(true);
		}
	}

	private boolean verificarDescuento() {
		String elementoSeleccionado = (String) jcbElemento.getSelectedItem();
		String numOT = txtOrdenTrabajo.getText();
		String elementoStock = stockMaterial.getElemento();
		String numOTStock = stockMaterial.getOrdenTrabajo()
				.getNumIdentificatorio();

		if (elementoSeleccionado.equals(elementoStock)
				&& numOT.equals(numOTStock)) {
			return true;
		} else {
			return false;
		}
	}

	public StockMaterial getStockMaterial() {
		return stockMaterial;
	}

	public void setStockMaterial(StockMaterial stockMaterial) {
		this.stockMaterial = stockMaterial;
	}
}
